package com.effect.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.savedrequest.NullRequestCache;

/**
 * FileName: SecurityConfig.java
 * 权限控制类

 * @version 1.0.0
 */
@Configuration // 标记为配置类
// 启用一套权限管理方案 prePostEnabled：该方案可以在控制类接口上通过注解的方式限制权限
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /*
         * 自定义权限规则
         * antMatchers 选择接口路径 *  匹配0或者任意数量的字符 ** 匹配0或者更多的目录
         * permitAll 允许任何人请求
         * authenticated 从 SecurityContext 中提取出来的用户对象
         * hasAuthority 表示该url需要特定权限 权限是在登录时服务账号的
         * hasRole 表示该url需要特定身份校验 身份是在的登录时赋予用户的
         *
         * hasAuthority("ROLE_teacher") 等同于 hasRole("teacher")
         * anyRequest 限定任意的请求
         * requestCache 开启缓存策略
         * sessionCreationPolicy 管理session的创建策略
         * NEVER 表示Security不会创建HttpSession，但如果它存在，将可以使用HttpSession
         */
        http.authorizeRequests()
                //
//                .antMatchers("/api/**").permitAll()
//                .antMatchers("/api/machine/saveMaintenancePDList").permitAll()
//                .antMatchers("/api/maintenance/exportExcelForMaintenance").permitAll()
//                .antMatchers("/api/**").hasRole("super")
                .antMatchers("/api/**").permitAll()
//                .antMatchers("/api/file/lockHandleFile").permitAll()
//                .antMatchers("/api/knowhow/lockHandleFile").permitAll()
//                .antMatchers("/api/**").authenticated()

//                .anyRequest().authenticated()

                .and()
                .requestCache()
                .requestCache(new NullRequestCache())
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.NEVER);
//                .and()
//                .addFilterAfter(GenericFilterBean(), UsernamePasswordAuthenticationFilter.class);
        http.cors().and().csrf().disable(); // 关闭csrf保护
    }

    @Bean // 将权限管理对象注册到spring容器中
    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }


}
